#include <sched.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pthread.h>

// 线程共享整个虚拟地址空间：
//  int *p = nullptr;

// void *threadrun(void *args)
// {
//     int a = 123;

//     p = &a;

//     while (true)
//     {
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, nullptr);

//     while (true)
//     {
//         std::cout << "*p : " << *p << std::endl;
//         sleep(1);
//     }

//     pthread_join(tid, nullptr);
//     return 0;
// }

/// 测试俩线程把共享的变量放到自己的线程局部存储中；
#include <pthread.h>
#include <iostream>
#include <string>
#include <unistd.h>

// 该count叫做线程的局部存储！
__thread int count = 1;
//这里还和写实拷贝不太一样；即使不修s改如果加上_thread也会放到线程局部存储里面。
//告诉线程把它拷贝一份放到自己的线程局部存储里；这样线程拿到的就是自己独占的count了
// 线程局部存储，只能存储内置类型和部分指针

std::string Addr(int &c)
{
    char addr[64];
    snprintf(addr, sizeof(addr), "%p", &c);
    return addr;
}

void *routine1(void *args)
{
    (void)args;
    while (true)
    {
        std::cout << "thread - 1, count = " << count << "[我来修改count], "
                  << "&count: " << Addr(count) << std::endl;
        count++;
        sleep(1);
    }
}

void *routine2(void *args)
{
    (void)args;
    while (true)
    {
        std::cout << "thread - 2, count = " << count
                  << ", &count: " << Addr(count) << std::endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid1, tid2;
    pthread_create(&tid1, nullptr, routine1, nullptr);
    pthread_create(&tid2, nullptr, routine2, nullptr);

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);

    return 0;
}